/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;
import mapeo.HibernateUtil;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
/**
 *
 * @author Elias Mendoza
 */
public class OperacionesDao {
  protected Session sesion;
    protected Transaction tx;

    public <Registro> boolean guardar(Registro r) throws HibernateException {

      boolean estado = true;
        try {
            iniciarOperacion();
            sesion.save(r);
            tx.commit();
        } catch (HibernateException he) {
          estado = false;
            manejarExcepcion(he);
            throw he;                  
        } finally {
            sesion.close();   
            return estado;
        }
   
    }
    public <Registro> boolean guardarCascada(Registro r) throws HibernateException {

      boolean estado = true;
        try {
            iniciarOperacion();
            sesion.persist(r);
            tx.commit();
        } catch (HibernateException he) {
          estado = false;
            manejarExcepcion(he);
            throw he;                  
        } finally {
            sesion.close();   
            return estado;
        }
   
    }
    public <Registro,Key> Key guardarActualizar(Registro r) throws HibernateException {
        Key id = null;
        try {
            iniciarOperacion();
            sesion.save(r);
            tx.commit();
        } catch (HibernateException he) {
            manejarExcepcion(he);
            throw he;
        } finally {
            sesion.close();
         
        }

        return id;
    }
    public <Registro> void actualizar(Registro r) throws HibernateException {
        try {
            iniciarOperacion();
            sesion.update(r);
            tx.commit();
        } catch (HibernateException he) {
            manejarExcepcion(he);
            throw he;
        } finally {
            sesion.close();
            
        }
    }

    public <Registro> void eliminar(Registro r) throws HibernateException {
        try {
            iniciarOperacion();
            sesion.delete(r);
            tx.commit();
        } catch (HibernateException he) {
            manejarExcepcion(he);
            throw he;
        } finally {
            sesion.close();
        }
    }

  protected void iniciarOperacion() throws HibernateException {
    sesion = HibernateUtil.getSessionFactory().openSession();
    tx = sesion.beginTransaction();
  }
  

  protected void manejarExcepcion(HibernateException he) throws HibernateException {
    tx.rollback();
    throw new HibernateException("Ocurrió un error en la capa de acceso a datos", he);
  }
  public boolean conectado(){
      boolean con = false;
      try{
          iniciarOperacion();
          if(sesion.isConnected())
              con = true;
      }
      finally{
          sesion.close();
      }
      return con;
  }
}
